<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // const auto = function () {
      //   console.log('this:', this) //
      // }
      // const obj = {
      //   a: '我是obj',
      // }

      // call apply bind
      // auto.call(obj) // call 改变this指向
      // var user = '123'

      // var a = {
      //   user: '追梦子',
      //   fn: function (a, b, c) {
      //     console.log(a, b, c, 'params')
      //     console.log(this, 'this')
      //     console.log('user:', this.user) //追梦子
      //   },
      // }
      // var b = a.fn
      // 注意如果call和apply的第一个参数写的是null，那么this指向的是window对象

      // b.apply(a, [11, 20, 40])
      // b.apply(null) // window
      // bind不会立即执行，而是会返回一个 函数，需要调用才执行
      // onClick={this.handleClick.bind(this)}
      // var c = b.bind(a)
      // console.log(c(), 'c')

      // b.call(a, '你好-call')
      // b.apply(a, [1, 2, 3, 4, 5])
      // b.bind(a, 'bind参数')()

      /**
       * call apply bind 都能改变this指向，
       * 1. call apply 是立即执行，但是apply的第二个参数，是数组，
       * 2. bind不会立即执行，而是会返回一个函数，通过调用这个函数，才能执行
       *
       */

      /**
       * 数据类型检测
       * typof
       * instanceof
       * Object.prototype.toString.call()
       * Array.isArray()
       *
       *
       */

      // class Person {}
      // class Animate {}
      // class Student extends Person {}
      // const p = new Person()
      // const s = new Student()

      // console.log(s instanceof Animate)

      // function Auto() {
      //   this.name = 'devin'
      // }
      // Auto.prototype.myName = function () {
      //   console.log('myName')
      // }
      // var a = new Auto()

      // console.log('a:', a)
      // 原型链条
      // 作用域链

      // let useCreate = {
      //   count: 1,
      //   getValue: () => {
      //     console.log(this, 'this')
      //     return this.count
      //   },
      // }
      // // console.log(useCreate.getValue()) // count :1
      // let doc = useCreate.getValue
      // doc()

      var shuzu = [10, 30, 40]
      shuzu.dispaly = () => {
        console.log(this, 'this')
      }
      shuzu.dispaly()
    </script>
  </body>
</html>
